והפעם טופס הרשמה מבית Yii על גבי MySQL.
לחץ כאן בכדי להגיע לחלק א' של המדריך; חלק ב'; חלק ג'.
במדריך הקודם הראיתי איך להתחבר למסד + שכבות MVC.
היום אני אלמד אתכם איך לעבוד עם המסד נתונים, ונעשה הרשמה + התחברות.
על מנת לעבוד עם מסד נתונים ב-YII נצטרך לעשות מודל שיורש מ-CActiveRecord.
ניצור תיקייה חדשה ב-protected שנקרא לה models.
עוד משהו חשוב שלא הזכרתי בחלקים קודמים במדריך: נוסיף import לקונטרולרים ולמודלים.
נפתח את ה-config שלנו:
protected/config/config.php
<?php
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:host=localhost;dbname=lesson",
"username" => "root",
"password" => "",
"charset" => "utf8"
)
)
);
?>
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:host=localhost;dbname=lesson",
"username" => "root",
"password" => "",
"charset" => "utf8"
)
)
);
?>
ונוסיף לשם אלמנט חדש בשם import; נעשה import ל-models ול-controller בסגנון הזה:
<?php
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:host=localhost;dbname=lesson",
"username" => "root",
"password" => "",
"charset" => "utf8"
)
),
"import" => array
(
"application.controllers.*",
"application.models.*"
)
);
?>
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:host=localhost;dbname=lesson",
"username" => "root",
"password" => "",
"charset" => "utf8"
)
),
"import" => array
(
"application.controllers.*",
"application.models.*"
)
);
?>
עכשיו ניצור טבלה במסד הנתונים שלנו שתיקרא accounts, שם יהיו המשתמשים שלנו. בטבלה יהיו השדות הבאים:
id - auto int
username - text
password - text
email - text
ip - text
בשאילתה:
CREATE TABLE `accounts` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`username` TEXT NOT NULL,
`password` TEXT NOT NULL,
`email` TEXT NOT NULL,
`ip` TEXT NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`username` TEXT NOT NULL,
`password` TEXT NOT NULL,
`email` TEXT NOT NULL,
`ip` TEXT NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
בתיקייה models ניצור מודל של המשתמשים שייקרא Account. כלומר, ניצור מחלקה חדשה בשם Account בקובץ protected/models/account.php, שהיא תירש מהמחלקה CActiveRecord.
protected/models/Account.php
<?php
class Account extends CActiveRecord
{
}
?>
class Account extends CActiveRecord
{
}
?>
על מנת שהמודל שלנו יידע על איזה טבלה הוא צריך לעבוד נצטרך ליצור פונקציה שתחזיר את השם של הטבלה, נקרא לה tableName. אם לא נשתמש בפונקציה הזאת, הוא ינסה להתחבר אל הטבלה בשם של המודל, מה שאומר שהוא היה מנסה להתחבר אל הטבלה Account, והרי לא יצרנו טבלה כזאת; אנחנו יצרנו טבלה בשם accounts. לכן, נשתמש בפונקציה שתחזיר accounts.
בנוסף, נצטרך עוד פוקנציה שתחזיר את ה-id של הטבלה. (הטור מסוג INT שעולה כל פעם ב-1. אני די בטוח שאתם פחות או יותר יודעים על מה אני מדבר.)
protected/models/Account.php
<?php
class Account extends CActiveRecord
{
public function tableName()
{
return 'accounts';
}
public function primaryKey()
{
return 'id';
}
}
?>
class Account extends CActiveRecord
{
public function tableName()
{
return 'accounts';
}
public function primaryKey()
{
return 'id';
}
}
?>
עכשיו אנחנו צריכים פונקציה שתקשר בין המודל למסד, מה שיאפשר לנו לבדוק כמות, לשלוף וכדומה מהמסד.
נקרא לה model, והיא תהיה public, static ותחזיר את המחלקה שאנו יורשים ממנה את הפונקציה model.
protected/models/Account.php
<?php
class Account extends CActiveRecord
{
public static function model()
{
return parent::model(__CLASS__);
}
public function tableName()
{
return 'accounts';
}
public function primaryKey()
{
return 'id';
}
}
?>
class Account extends CActiveRecord
{
public static function model()
{
return parent::model(__CLASS__);
}
public function tableName()
{
return 'accounts';
}
public function primaryKey()
{
return 'id';
}
}
?>
עכשיו, לאחר שהסברתי על זה, אראה לכם איך להשתמש במודל הזה - נעשה טופס הרשמה. :)
YII נותן לנו אפשרות לעשות טפסים בנוחות רבה יותר, אבל אני לא אראה את הדרך הזאת בחלק הזה של המדריך, אולי באחד החלקים הבאים.
נתחיל. דבר ראשון ננקה את ה-MainController, כך:
protected/controllers/MainController.php
<?php
class MainController extends CController
{
public $layout = 'header';
public function actionIndex()
{
}
}
?>
class MainController extends CController
{
public $layout = 'header';
public function actionIndex()
{
}
}
?>
עכשיו ניצור לינק לדף ההרשמה:
<?php
class MainController extends CController
{
public $layout = 'header';
public function actionIndex()
{
$this->renderText("<a href='index.php?r=account/register'>הירשם</a>");
}
}
?>
class MainController extends CController
{
public $layout = 'header';
public function actionIndex()
{
$this->renderText("<a href='index.php?r=account/register'>הירשם</a>");
}
}
?>
על renderText אני חושב שהסברתי, אבל בכל מקרה: renderText זה כמו render, רק שהוא מרנדר טקסט במקום קובץ.
כמו שאתם רואים, הקישור מוביל אל הקונטרולר Account ואל הפעולה register. אם ניכנס לקישור, אנו נקבל שגיאה: אי אפשר להיכנס אל ה-controller הזה.
אז בואו ניצור AccountController.
protected/controllers/AccountController.php
<?php
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$this->render('register');
}
}
?>
class AccountController extends CController
{
public $layout = 'header';
public function actionRegister()
{
$this->render('register');
}
}
?>
עכשיו, כמו שאתם רואים, אנחנו מרנדרים את ה-register, אז בואו ניצור את הטופס.
protected/views/accounts/register.php
<h2>הרשמה</h2>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
כמו שאמרתי מקודם, yii נותנת אפשרות לעבוד עם טפסים בדרכים נוחות יותר, אבל על זה אלמד אתכם את זה בחלקים הבאים של המדריך.
נמשיך. דבר ראשון נבדוק אם המשתמש שלח את הטופס וגם נגדיר משתנים של הטופס. נעשה את זה בקובץ הרינדור.
<h2>הרשמה</h2>
<?php
if(isset($_POST['register']))
{
$username = $_POST['username'];
$password = $_POST['password'];
$password2 = $_POST['password2'];
$email = $_POST['email'];
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['register']))
{
$username = $_POST['username'];
$password = $_POST['password'];
$password2 = $_POST['password2'];
$email = $_POST['email'];
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
בואו נכתוב מחלקה שתעזור לנו עם הפונקציות.
ניצור תיקייה חדשה בשם sources בתוך התיקייה protected, ושם ניצור מחלקה בשם Help שהיא לא תירש משום מחלקה.
protected/sources/Help.php
<?php
class Help
{
}
?>
class Help
{
}
?>
שם נעשה שתי פונקציות: בדיקת תקינות דוא"ל ואבטחה מסוג public, static.
<?php
class Help
{
public static function protect($value)
{
return htmlspecialchars(addslashes(trim($value)));
}
public static function is_mail($mail)
{
if(strpos($mail, '@') === false) return false;
$host = explode("@",$mail); $mxarr = array();
$regexp = '/^[-!#$%&\'*+\\.\/0-9=?A-Z^_`{|}~]+@([-0-9A-Z]+\.)+([0-9A-Z]){2,4}$/i';
if (!preg_match($regexp, $mail)) return false;
if (function_exists('getmxrr') && !getmxrr($host[1],$mxarr)) return false;
return true;
}
}
?>
class Help
{
public static function protect($value)
{
return htmlspecialchars(addslashes(trim($value)));
}
public static function is_mail($mail)
{
if(strpos($mail, '@') === false) return false;
$host = explode("@",$mail); $mxarr = array();
$regexp = '/^[-!#$%&\'*+\\.\/0-9=?A-Z^_`{|}~]+@([-0-9A-Z]+\.)+([0-9A-Z]){2,4}$/i';
if (!preg_match($regexp, $mail)) return false;
if (function_exists('getmxrr') && !getmxrr($host[1],$mxarr)) return false;
return true;
}
}
?>
כמו שאתם רואים, השתמשתי בקוד של אלכס לבדיקת דוא"ל.
אז בואו נוסיף את פונקציית האבטחה שלנו לקוד ההרשמה:
<h2>הרשמה</h2>
<?php
if(isset($_POST['register']))
{
$username = Help::protect($_POST['username']);
$password = Help::protect($_POST['password']);
$password2 = Help::protect($_POST['password2']);
$email = Help::protect($_POST['email']);
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['register']))
{
$username = Help::protect($_POST['username']);
$password = Help::protect($_POST['password']);
$password2 = Help::protect($_POST['password2']);
$email = Help::protect($_POST['email']);
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
ונוסיף import לתיקייה sources ב-config שלנו:
<?php
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:localhost;dbname=lesson",
"username" => "root",
"password" => "",
"charset" => "utf8"
)
),
"import" => array
(
"application.controllers.*",
"application.sources.*",
"application.models.*"
)
);
?>
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:localhost;dbname=lesson",
"username" => "root",
"password" => "",
"charset" => "utf8"
)
),
"import" => array
(
"application.controllers.*",
"application.sources.*",
"application.models.*"
)
);
?>
עכשיו ניצור משתנה בשם error, שהוא יהיה מערך שיחזיר את כל השגיאות שלנו, ונוסיף כמה תנאים בסיסיים.
<h2>הרשמה</h2>
<?php
if(isset($_POST['register']))
{
$username = Help::protect($_POST['username']);
$password = Help::protect($_POST['password']);
$password2 = Help::protect($_POST['password2']);
$email = Help::protect($_POST['email']);
$error = array();
if($password != $password2)
$error[] = "הסיסמא שבשדה אימות הסיסמא אינה זהה לסיסמא שהוקלדה בשדה הסיסמא";
if(strlen($password) < 6)
$error[] = "מספר התווים בסיסמא קטן מ-6";
if(strlen($username) > 12 || strlen($username) < 4)
$error[] = "מספר התווים המותרת בשם משתמש הינה 4-12";
if(!Help::is_mail($email))
$error[] = "הדוא"ל אינו תקין";
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['register']))
{
$username = Help::protect($_POST['username']);
$password = Help::protect($_POST['password']);
$password2 = Help::protect($_POST['password2']);
$email = Help::protect($_POST['email']);
$error = array();
if($password != $password2)
$error[] = "הסיסמא שבשדה אימות הסיסמא אינה זהה לסיסמא שהוקלדה בשדה הסיסמא";
if(strlen($password) < 6)
$error[] = "מספר התווים בסיסמא קטן מ-6";
if(strlen($username) > 12 || strlen($username) < 4)
$error[] = "מספר התווים המותרת בשם משתמש הינה 4-12";
if(!Help::is_mail($email))
$error[] = "הדוא"ל אינו תקין";
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
עכשיו מה שנשאר זה לבדוק זה אם המשתמש כבר קיים במסד הנתונים.
ואת זה נעשה כך: במודל Account ניצור פונקציה בשם userExists שהוא יחזיר אמת אם המשתמש קיים ושקר אם המשתמש לא קיים. ואיך בד"כ בודקים אם משתמש קיים במסד? ע"י בדיקה אם הוא מופיע יותר מ-0 פעמים במסד.
protected/models/Account.php
<?php
class Account extends CActiveRecord
{
public static function model()
{
return parent::model(__CLASS__);
}
public function tableName()
{
return 'accounts';
}
public function primaryKey()
{
return 'id';
}
public static function userExists($user)
{
return self::model()->countByAttributes( array('username'=>$user) ) > 0;
}
}
?>
class Account extends CActiveRecord
{
public static function model()
{
return parent::model(__CLASS__);
}
public function tableName()
{
return 'accounts';
}
public function primaryKey()
{
return 'id';
}
public static function userExists($user)
{
return self::model()->countByAttributes( array('username'=>$user) ) > 0;
}
}
?>
ועכשיו הסבר:
הפונקציה model נותנת לנו אפשרות לבדוק כמות, לשלוף, למחוק ועוד מהמסד.
במקרה הזה בדקנו כמות לפי כמות הפעמים שהשורה username שווה ל-$user, שאת זה אנחנו עושים במערך.
אם אנחנו היינו עושים count במקום countByAttributes, זה היה מחזיר את כמות הטורים בטבלה, לכן השתמשנו ב-countByAttributes, ובאמצעותו בדקנו אם מס' הפעמים ששם המשתמש שהוכנס לטופס גדול מ-0. אני מקווה שהבנתם, אם לא תכתבו לי, ואשתדל להסביר טוב יותר.
עכשיו בואו נשתמש בפונקציה הזאת:
<h2>הרשמה</h2>
<?php
if(isset($_POST['register']))
{
$username = Help::protect($_POST['username']);
$password = Help::protect($_POST['password']);
$password2 = Help::protect($_POST['password2']);
$email = Help::protect($_POST['email']);
$error = array();
if($password != $password2)
$error[] = "הסיסמא שבשדה אימות הסיסמא אינה זהה לסיסמא שהוקלדה בשדה הסיסמא";
if(strlen($password) < 6)
$error[] = "מספר התווים בסיסמא קטן מ-6";
if(strlen($username) > 12 || strlen($username) < 4)
$error[] = "מספר התווים המותרת בשם משתמש הינה 4-12";
if(!Help::is_mail($email))
$error[] = "הדואל אינו תקין";
if(Account::userExists($username))
$error[] = "המשתמש שבחרת כבר קיים";
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['register']))
{
$username = Help::protect($_POST['username']);
$password = Help::protect($_POST['password']);
$password2 = Help::protect($_POST['password2']);
$email = Help::protect($_POST['email']);
$error = array();
if($password != $password2)
$error[] = "הסיסמא שבשדה אימות הסיסמא אינה זהה לסיסמא שהוקלדה בשדה הסיסמא";
if(strlen($password) < 6)
$error[] = "מספר התווים בסיסמא קטן מ-6";
if(strlen($username) > 12 || strlen($username) < 4)
$error[] = "מספר התווים המותרת בשם משתמש הינה 4-12";
if(!Help::is_mail($email))
$error[] = "הדואל אינו תקין";
if(Account::userExists($username))
$error[] = "המשתמש שבחרת כבר קיים";
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
עכשיו בואו פשוט נבדוק את כמות השגיאות, אם היא גדולה מ-0 נציג את השגיאות, ואם לא - נציג הודעה שהוא נוסף בהצלחה.
<h2>הרשמה</h2>
<?php
if(isset($_POST['register']))
{
$username = Help::protect($_POST['username']);
$password = Help::protect($_POST['password']);
$password2 = Help::protect($_POST['password2']);
$email = Help::protect($_POST['email']);
$error = array();
if($password != $password2)
$error[] = "הסיסמא שבשדה אימות הסיסמא אינה זהה לסיסמא שהוקלדה בשדה הסיסמא";
if(strlen($password) < 6)
$error[] = "מספר התווים בסיסמא קטן מ-6";
if(strlen($username) > 12 || strlen($username) < 4)
$error[] = "מספר התווים המותרת בשם משתמש הינה 4-12";
if(!Help::is_mail($email))
$error[] = "הדואל אינו תקין";
if(Account::userExists($username))
$error[] = "המשתמש שבחרת כבר קיים";
if(count($error) == 0)
{
echo "נרשמת בהצלחה";
}
else
{
foreach($error as $er)
print $er . "<br />";
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['register']))
{
$username = Help::protect($_POST['username']);
$password = Help::protect($_POST['password']);
$password2 = Help::protect($_POST['password2']);
$email = Help::protect($_POST['email']);
$error = array();
if($password != $password2)
$error[] = "הסיסמא שבשדה אימות הסיסמא אינה זהה לסיסמא שהוקלדה בשדה הסיסמא";
if(strlen($password) < 6)
$error[] = "מספר התווים בסיסמא קטן מ-6";
if(strlen($username) > 12 || strlen($username) < 4)
$error[] = "מספר התווים המותרת בשם משתמש הינה 4-12";
if(!Help::is_mail($email))
$error[] = "הדואל אינו תקין";
if(Account::userExists($username))
$error[] = "המשתמש שבחרת כבר קיים";
if(count($error) == 0)
{
echo "נרשמת בהצלחה";
}
else
{
foreach($error as $er)
print $er . "<br />";
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
עכשיו באמת נוסיף את המשתמש למסד. איך נעשה את זה?
$account = new Account();
$account->username = $username;
$account->password = md5($password);
$account->email = $email;
$account->save();
$account->username = $username;
$account->password = md5($password);
$account->email = $email;
$account->save();
כמו שאתם רואים, יצרתי מחלקה חדשה של המודל account.
לאחר מכן הוספתי למשתנה username את שם המשתמש, ל-password את הסיסמא עם הצפנת md5 ואת האימייל ל-email. אח"כ ביצעתי שמירה, מכיוון שיצרתי מחלקה חדשה.
בואו נשלב את זה לקוד:
protected/views/account/register.php
<h2>הרשמה</h2>
<?php
if(isset($_POST['register']))
{
$username = Help::protect($_POST['username']);
$password = Help::protect($_POST['password']);
$password2 = Help::protect($_POST['password2']);
$email = Help::protect($_POST['email']);
$error = array();
if($password != $password2)
$error[] = "הסיסמא שבשדה אימות הסיסמא אינה זהה לסיסמא שהוקלדה בשדה הסיסמא";
if(strlen($password) < 6)
$error[] = "מספר התווים בסיסמא קטן מ-6";
if(strlen($username) > 12 || strlen($username) < 4)
$error[] = "מספר התווים המותרת בשם משתמש הינה 4-12";
if(!Help::is_mail($email))
$error[] = "הדואל אינו תקין";
if(Account::userExists($username))
$error[] = "המשתמש שבחרת כבר קיים";
if(count($error) == 0)
{
$account = new Account();
$account->username = $username;
$account->password = md5($password);
$account->email = $email;
$account->save();
echo "נרשמת בהצלחה";
}
else
{
foreach($error as $er)
print $er . "<br />";
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['register']))
{
$username = Help::protect($_POST['username']);
$password = Help::protect($_POST['password']);
$password2 = Help::protect($_POST['password2']);
$email = Help::protect($_POST['email']);
$error = array();
if($password != $password2)
$error[] = "הסיסמא שבשדה אימות הסיסמא אינה זהה לסיסמא שהוקלדה בשדה הסיסמא";
if(strlen($password) < 6)
$error[] = "מספר התווים בסיסמא קטן מ-6";
if(strlen($username) > 12 || strlen($username) < 4)
$error[] = "מספר התווים המותרת בשם משתמש הינה 4-12";
if(!Help::is_mail($email))
$error[] = "הדואל אינו תקין";
if(Account::userExists($username))
$error[] = "המשתמש שבחרת כבר קיים";
if(count($error) == 0)
{
$account = new Account();
$account->username = $username;
$account->password = md5($password);
$account->email = $email;
$account->save();
echo "נרשמת בהצלחה";
}
else
{
foreach($error as $er)
print $er . "<br />";
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>שם משתמש</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>סיסמא</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>אימות סיסמא</td>
<td><input type="password" name="password2" /></td>
</tr>
<tr>
<td>דואר אלקטרוני</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register" value="הירשם" /></td>
</tr>
</table>
</form>
בחלק הבא של המדריך אלמד אתכם איך לעשות התחברות + פרופיל (לשלוף נתונים
תגובות לכתבה:
כל הכבוד על המדריך.
הייתי מוסיף עוד מילה שתיים למה שהאח היקר אמר פה.
באופן כללי ל YII יש תמיכה מובנית לעשות וולידציות לשדות, באמצעות הגדרת הוולדיציות על כל שדה במודל עצמו. אפשר להרחיב בנושא באמצעות קריאת מדריך השלמה (פרק עבודה עם קבצים) כאן:
http://www.yiiframework.com/doc/guide/1.1/he/form.overview
+ לא בטוח שצריך את protect ברמה כזו.
return htmlspecialchars(addslashes(trim($value)));
את addSlashes הפריימוורק עושה מימלא כשמכניסים משהו למסד
ואת ה htmlSpceialChars דווקא צריך, אבל רק איפה שמציגים את הנתונים. אם הם לא נשלחים לדפדפן בשום מקום - אין ממש טעם לעשות להם htmlSpecialChars
אני רשמתי כמה פעמים שאפשר לעשות טפסים בעזרת מודל של YII אבל אני לא אעשה את זה במדריך הזה אני אעשה את במדריכים הבאים
לא הכי הבנתי את
$account = new Account();
$account->username = $username;
$account->password = md5($password);
$account->email = $email;
$account->save();
יש לי שגיאה:
The table "emails" for active record class "Emails" cannot be found in the database.
הטבלה הזאת קיימת במסד בנתונים...
אוקיי עכשיו שמתי לב מה היית הבעיה שלי :p
אני אערוך ואתקן את זה עכשיו
בטעות בconfig לא רשמתי את הconnectionString נכון
זה אמור להיות ככה: mysql:host=HOSTNAME;dbname=DBNAME
אני עורך ומתקן
אני זה משתמש_90075 פשוט לא הייתי מחובר
מי שלא הבין את ההוספה למסד זה ככה:
עשיתי משתנה שהוא יכיל את המשתמש החדש (עשיתי מודל חדש)
ואז הגדרתי שהusername יהיה שווה לusername, אותו דבר עם הסיסמה והאימייל
ואז הוספתי
תוווווווווווודה רבה! D=
עזרת לי כל כך!!!!!!!!!!
מה יהיה במדריך הבא?
שאלה:
יש לי באתר כמה דפים שאני רוצה שיהיה בהם אותו דבר באיזה חלק באמצע.
איך אני יכול (בדפים האלה שנמצאים בviwe) להוסיף קטע שיהיה זהה בכולם?
נ.ב.
המדריכים האלה פ33ה!
אתה יכול להוציא את החלק שחוזר על עצמו לקובץ view נפרד ולעשות לו
renderPartial במקומות שצריך
תודה רבה רבה רבה, ענקית! הסדרת מדריכים שלך היא ענקית, מושקעת, מובנת!!!
ממש ממש ממש מצפה למשך. המשך כך גבר! כל הכבוד :).
אני פשוט לא מבין למה אתה מלבד בצורה של כתיבת קוד מסיבי בתבנית? זה קצת הזוי לדעתי..
וגם, למה להתחיל לעשות vail ידני בכח, ברגע שיש לך אפשרות רק להגדיר rules וסיימת את הפינה (אם זה בדיקת מייל, או אפילו סיסמה כפולה).
אני לא חושב שזה הדרך הנכונה ללמד.. זה פשוט צורה קצת עקומה של פיתוח תחת Yii. שלא לדבר על כך שכתבת את הלינק ידני ולא השתמשת בפונ' createUrl על פי הקונטרול/אקשיין. :\
משתמש_90926 זה אני. זה פשוט לא חיבר אותי.
KingYes אני כאן רק מלמד על עבודה עם מסד אני לא יכול לעשות כל כך הרבה במדריך אחד.
כנראה שאתה לא קראת את המדריך אם אתה אומר ככה.
אמרתי שYII נותנת לעשות טפסים בצורה פשוטה יותר אבל אני אלמד על זה יותר מאוחר.
ו-CHTML גם לא צריך להיות מופיע כאן אולי בהמשך אבל למה להעמיס כל כך הרבה על מדריך אחד.
מתי הבא?
תודה רבה על המדריך. :)
ואיך אני מדפיס לפי זה טבלה שבה יש את כל שמות המשתמשים?
שגיאה!,
כשאני נכנס לאתר, אני רואה רק קישור בשם "הירשם", כשאני לוחץ עליו מופיעה לי הודעת השגיאה הבאה:
Internal Server Error
AccountController cannot find the requested view "register".
An internal error occurred while the Web server was processing your request. Please contact the webmaster to report this problem.
Thank you.
כנראה עשית render לregister אבל הקובץ protected/views/account/register.php לא קיים תבדוק שכתבת נכון את שם הקובץ
אהממממ....
>>ואיך אני מדפיס לפי זה טבלה שבה יש את כל שמות המשתמשים?
למה הוא לא מזהה לי את העברית, העתקתי את הקבצים אחד לאחד מהמדריך. הMETA של הUTF8 נמצא בקובץ הHEADER. אז למה זה מראה לי ג'יבריש?
לא הבנתי את הודעת השגיאה הזאת:
לא הבנתי את הודעת השגיאה הזאת:
Internal Server Error
Declaration of Account::model() should be compatible with CActiveRecord::model($className = 'CActiveRec...')
ואיך פותרים אותה כמובן
Aviway,
תפתח QA בשביל זה.
אין גישה למודל מהקונטרולר ?
זה לא נוגד קצת את הפריימוורקים שצריך לדחוף את "הקוד המכוער" לתוך המודל ?
טעות שלי . סליחה .
(התבלבלתי עם פריימוורק אחר שהמודל נטען אוטומטית)
Internal Server Error
Undefined index: username
An internal error occurred while the Web server was processing your request. Please contact the webmaster to report this problem.
Thank you.
זאת השגיאה שמציג לי ?! למה הוא לא מזהה את האיברים שהוצגו בקוד PHP? =\